package taskrunner

import (
	"errors"
	"gitee.com/Cookie_XiaoD/video_server/scheduler/dbops"
	"log"
	"os"
	"sync"
	"fmt"
)

//task是实际执行的任务内容
//我们这里的task的功能
//dispatcher获取要删除的视频，由executer执行实际的删除

func VideoClearDispatcher(dc dataChan) error {
	res, err := dbops.ReadVideoDeletionRecord(3)
	if err != nil {
		log.Printf("视频清理调度器错误：%v", err)
		return err
	}

	if len(res) == 0 {
		return errors.New("所有任务已经结束")
	}

	for _, id := range res {
		log.Println("需要删除的视频ID："+id)
		dc <- id
	}

	return nil

}

func VideoClearExecutor(dc dataChan) error {
	errMap := sync.Map{}
	var err error

	wg := sync.WaitGroup{}

forloop:
	for {
		select {
		case vid := <-dc:
			wg.Add(1)
			go func(id interface{}) {
				defer wg.Done()
				curVid := id.(string)
				if err := deleteVideo(curVid); err != nil {
					errMap.Store(id, err)
					return
				}
				if err := dbops.DelVideoDeletionRecord(curVid); err != nil {
					errMap.Store(id, err)
					return
				}
			}(vid)
		default:
			break forloop
		}
	}

	wg.Wait()

	//只要有一个error就抛出
	errMap.Range(func(k, v interface{}) bool {
		err = v.(error)
		return false
	})

	return err
}

func deleteVideo(vid string) error {
	err := os.Remove(VIDEO_PATH + vid + ".mp4")
	//如果存在错误，但是错误不是文件不存在的错误，
	//那么才是真的错误
	if err != nil && !os.IsNotExist(err) {
		return err
	}
	fmt.Println("删除文件："+err.Error())
	return nil
}
